2 // AMPurpleJabberAdHocCommand.m
5 // Created by Evan Schoenberg on 9/5/07.
8 #import "AMPurpleJabberAdHocCommand.h"
9 #import "AMPurpleJabberFormGenerator.h"
10 #import "AMPurpleJabberAdHocServer.h"
12 @implementation AMPurpleJabberAdHocCommand
14 - (id)initWithServer:(AMPurpleJabberAdHocServer*)_server command:(xmlnode*)_command jid:(NSString*)_jid iqid:(NSString*)_iqid {
15 if((self = [super init])) {
17 command = xmlnode_copy(_command);
25 xmlnode_free(command);
32 - (AMPurpleJabberFormGenerator*)form {
33 xmlnode *form = xmlnode_get_child_with_namespace(command,"x","jabber:x:data");
36 return [[[AMPurpleJabberFormGenerator alloc] initWithXML:form] autorelease];
43 - (NSString*)sessionid {
46 const char *sessionid_orig = xmlnode_get_attrib(command,"sessionid");
49 return [NSString stringWithUTF8String:sessionid_orig];
52 - (void)setSessionid:(NSString*)_sessionid {
54 sessionid = [_sessionid copy];
58 - (AMPurpleJabberAdHocCommand*)generateReplyWithForm:(AMPurpleJabberFormGenerator*)form actions:(NSArray*)actions defaultAction:(unsigned)defaultAction status:(enum AMPurpleJabberAdHocCommandStatus)status {
59 const char *nodeattr = xmlnode_get_attrib(command,"node");
62 xmlnode *newcmd = xmlnode_new("command");
63 xmlnode_set_namespace(newcmd,"http://jabber.org/protocol/commands");
64 xmlnode_set_attrib(newcmd,"node",nodeattr);
67 xmlnode_set_attrib(newcmd,"status","executing");
70 xmlnode_set_attrib(newcmd,"status","canceled");
73 xmlnode_set_attrib(newcmd,"status","completed");
76 NSString *sessionid_orig = [self sessionid];
78 xmlnode_set_attrib(newcmd,"sessionid",[sessionid_orig UTF8String]);
81 xmlnode *actionsnode = xmlnode_new_child(newcmd,"actions");
82 xmlnode_set_attrib(actionsnode,"execute",[[actions objectAtIndex:defaultAction] UTF8String]);
83 NSEnumerator *e = [actions objectEnumerator];
85 while((actionstr = [e nextObject]))
86 xmlnode_new_child(actionsnode, [actionstr UTF8String]);
89 xmlnode_insert_child(newcmd,[form xml]);
91 AMPurpleJabberAdHocCommand *cmd = [[AMPurpleJabberAdHocCommand alloc] initWithServer:server command:newcmd jid:jid iqid:iqid];
93 return [cmd autorelease];
96 - (AMPurpleJabberAdHocCommand*)generateReplyWithNote:(NSString*)text type:(enum AMPurpleJabberAdHocCommandNoteType)type status:(enum AMPurpleJabberAdHocCommandStatus)status {
97 const char *nodeattr = xmlnode_get_attrib(command,"node");
100 xmlnode *newcmd = xmlnode_new("command");
101 xmlnode_set_namespace(newcmd,"http://jabber.org/protocol/commands");
102 xmlnode_set_attrib(newcmd,"node",nodeattr);
105 xmlnode_set_attrib(newcmd,"status","executing");
108 xmlnode_set_attrib(newcmd,"status","canceled");
111 xmlnode_set_attrib(newcmd,"status","completed");
114 NSString *sessionid_orig = [self sessionid];
116 xmlnode_set_attrib(newcmd,"sessionid",[sessionid_orig UTF8String]);
118 xmlnode *note = xmlnode_new_child(newcmd,"note");
121 xmlnode_set_attrib(note,"type","error");
124 xmlnode_set_attrib(note,"type","info");
127 xmlnode_set_attrib(note,"type","warn");
131 xmlnode_insert_data(note,[text UTF8String],-1);
133 AMPurpleJabberAdHocCommand *cmd = [[AMPurpleJabberAdHocCommand alloc] initWithServer:server command:newcmd jid:jid iqid:iqid];
134 xmlnode_free(newcmd);
135 return [cmd autorelease];
139 PurpleAccount *account = [[server account] purpleAccount];
140 xmlnode *iq = xmlnode_new("iq");
142 xmlnode_set_attrib(iq, "id", [iqid UTF8String]);
143 xmlnode_set_attrib(iq, "to", [jid UTF8String]);
144 xmlnode_set_attrib(iq, "type", "result");
145 xmlnode *cmdcopy = xmlnode_copy(command);
147 xmlnode_set_attrib(cmdcopy, "sessionid", [sessionid UTF8String]);
148 xmlnode_insert_child(iq, cmdcopy);
151 char *text = xmlnode_to_str(iq, &len);
152 PURPLE_PLUGIN_PROTOCOL_INFO(purple_account_get_connection(account)->prpl)->send_raw(purple_account_get_connection(account), text, len);